<?php
namespace app\api\controller;

use think\App;
use think\Exception;
use think\facade\{Log, Db};

use app\BaseController;

use app\api\model\{UserShop};

class LakalapayController extends BaseController
{
    protected $appid;
    protected $token;
    protected $secret_key;
    protected $shopNo;
    protected $termId;
    protected $out_trade_no;
    protected $body;
    protected $total_fee;
    protected $notify;

    public function pay($data)
    {
        $this->appid        = '849215';
        $this->token        = 'a5ffd772cd377c6100b90628f1d7b2e9';
        $this->secret_key   = '04cc16a25fea63208e6cf8d90bccf510';
        $this->openid       = $data['openid'];
        $this->shopNo       = $data['shopNo'];
        $this->termId       = $data['termId'];
        $this->out_trade_no = $data['order_no'];
        $this->amount       = $data['total_fee'];
        $this->body         = $data['body'];
        $this->notify       = $data['notify'];
        return $this->wxpay();
    }

    public function back($data)
    {
        $this->appid        = '849215';
        $this->token        = 'a5ffd772cd377c6100b90628f1d7b2e9';
        $this->secret_key   = '04cc16a25fea63208e6cf8d90bccf510';
        $this->shopNo       = $data['shopNo'];
        $this->termId       = $data['termId'];
        $this->oriDate      = $data['oriDate'];
        $this->amount       = $data['total_fee'];
        $this->tradeNo      = $data['tradeNo'];
        $this->order_no     = $data['order_no'];
        $this->notify       = $data['notify'];
        return $this->group_back();
    }

    //微信小程序接口
    public function wxpay(){  //统一下单接口
        $unifiedorder = json_decode($this->unifiedorder(), true);

        $data = [
            'code'       => 400,
            'sign'       => [],
            'return_msg' => $unifiedorder['retMsg'],
        ];

        if($unifiedorder['retCode'] == '000000'){ /** 成功 */
            $data = [
                'code' => 200,
                'sign' => $unifiedorder['respData'],
            ];
        }

        return $data;
    }

    //统一下单接口
    private function unifiedorder()
    {
        $url = 'https://ipos.lakala.com/q/api/mch/cmd';

        $reqData = array(
            'shopNo'            => $this->shopNo, /** 商户号 */
            'termId'            => $this->termId, /** 终端号 */
            'payMode'           => 'WECHAT', /** 支付模式 */
            'amount'            => str_pad(floatval($this->amount * 100), 12, "0", STR_PAD_LEFT), /** 总金额（单位：分） */
            // 'amount'            => str_pad(1, 12, "0", STR_PAD_LEFT), /** 总金额（单位：分） */
            'openId'            => $this->openid, /** 用户openid */
            'spbillCreateIp'    => $this->get_client_ip(), /** 终端IP */
            'transType'         => '51', /** 接入方式 */
            'orderId'           => $this->out_trade_no, /** 商户订单号 */
            'appId'             => 'wxef775408a6e60261', /** 小程序的appid */
            'notifyUrl'         => config('app.url') . '/api/Lakalapay/' . $this->notify, /** 通知地址，确保外网能正常访问 */
            'subject'           => $this->body, /** 商品描述 */
        );

        $parameters = [
            'reqData'      => $reqData,
            'appid'        => $this->appid,
            'token'        => $this->token,
            'sign'         => $this->getSign($reqData),
            'cmd'          => 'QR_ORDER_PRE_ORDERPAY',
            'channel'      => 'LAKALA',
            'productType'  => 'LKL_APP_QR',
        ];

        $postData = json_encode($parameters);
        $backData = $this->post2($url, $postData, true);

        return $backData;
    }

    /** 团购退款 */
    public function group_back()
    {
        $url = 'https://ipos.lakala.com/q/api/mch/cmd';

        $reqData = array(
            'shopNo'            => $this->shopNo, /** 商户号 */
            'termId'            => $this->termId, /** 终端号 */
            'oriDate'           => $this->oriDate, /** 时间（MMDD） */
            'amount'            => str_pad(floatval($this->amount * 100), 12, "0", STR_PAD_LEFT), /** 总金额（单位：分） */
            // 'amount'            => str_pad(1, 12, "0", STR_PAD_LEFT), /** 总金额（单位：分） */
            'tradeNo'           => $this->tradeNo,  /** 拉卡拉交易单号 */
            'refundOrderId'     => $this->order_no,  /** 退款单号 */
        );

        $parameters = [
            'reqData'      => $reqData,
            'appid'        => $this->appid,
            'token'        => $this->token,
            'sign'         => $this->getSign($reqData),
            'cmd'          => 'QR_REFUND_ORDER',
            'channel'      => 'LAKALA',
            'productType'  => 'LKL_APP_QR',
        ];

        $postData = json_encode($parameters);

        /** 拉卡拉返回的结果 */
        $backData = $this->post2($url, $postData, true);
        $backData = json_decode($backData, true);

        if($backData['retCode'] != '000000'){
            $this->error_back($backData['retMsg']);
        }

        $respData = $backData['respData'];

        Db::name('order_back')->where(['order_no' => $respData['orderId']])->update(['refundOrderId' => $respData['refundOrderId'], 'refundTradeNo' => $respData['refundTradeNo']]);

        /** 退款查询 */
        $reqData2 = array(
            'shopNo'            => $this->shopNo, /** 商户号 */
            'termId'            => $this->termId, /** 终端号 */
            'refundTradeNo'     => $respData['refundTradeNo'],  /** 平台退款单号 */
        );

        $parameters2 = [
            'reqData'      => $reqData2,
            'appid'        => $this->appid,
            'token'        => $this->token,
            'sign'         => $this->getSign($reqData),
            'cmd'          => 'QR_REFUND_QUERY_ORDER',
            'channel'      => 'LAKALA',
            'productType'  => 'LKL_APP_QR',
        ];

        $postData2 = json_encode($parameters2);

        /** 拉卡拉返回的结果 */
        $backData2 = $this->post2($url, $postData2, true);
        $backData2 = json_decode($backData2, true);

        if($backData2['retCode'] == '000000'){
            Db::name('order_back')->where(['order_no' => $respData['orderId']])->update(['status' => 2]);
        }
    }

    private function post2($url, $data = NULL, $json = false)
    {
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

        if(!empty($data)){
            if($json && is_array($data)){
                $data = json_encode( $data );
            }

            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

            if($json){ //发送JSON数据
                curl_setopt($curl, CURLOPT_HEADER, 0);
                curl_setopt($curl, CURLOPT_HTTPHEADER,
                    array(
                        'Content-Type: application/json; charset=utf-8',
                        'Content-Length:' . strlen($data)
                    )
                );
            }
        }

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($curl);
        $errorno = curl_errno($curl);

        if($errorno){
            return array('errorno' => false, 'errmsg' => $errorno);
        }

        curl_close($curl);
        return $res;
    }

    // 支付回调
    public function notify()
    {
        $data = file_get_contents('php://input');
        $data = json_decode($data, true);

        $respData = isset($data['respData']) ? $data['respData'] : [];

        if(empty($respData)){
            return 'FAIL';
        }

        Log::write($data);
        
        if($data['retCode'] == '000000'){
            $out_trade_no = $respData['orderId'];  // 商户订单号

            $orderInfo  = Db::name('order')->where(['order_no' => $out_trade_no])->find();
            $userInfo   = Db::name('users')->where(['id' => $orderInfo['user_id']])->find();
            $goods_info = Db::name('goods')->where(['id' => $orderInfo['goods_id']])->find();

            $admin_id = $orderInfo['admin_id'];

            $admin_info = Db::name('admin')->where(['id' => $admin_id])->find();

            Db::startTrans(); 
            try {
                /** 获得直购奖的ID */
                $push_user_id = $orderInfo['to_user_id']?$orderInfo['to_user_id']:$userInfo['pid'];

                if($push_user_id > 0){
                    /** 受益人在当前店铺的资产信息 */
                    $userPushShopInfo = Db::name('user_shop')->where(['user_id' => $push_user_id, 'admin_id' => $admin_id])->find();

                    if($userPushShopInfo && $userPushShopInfo['star_id'] > 0){
                        /** 查询受益人的直购奖比例 */
                        $push_money = Db::name('star')->where(['id' => $userPushShopInfo['star_id']])->value('bonus_ratio');

                        if($push_money > 0){
                            /** 增加受益人在当前店铺的佣金 */
                            $fst_money_flag = Db::name('user_shop')->where(['user_id' => $push_user_id, 'admin_id' => $admin_id])->inc('money', (int)$orderInfo['price'] * $push_money)->update();
                            
                            if($fst_money_flag === false){
                                throw new Exception("更新会员佣金失败【" . $push_user_id . "】");
                            }
                            
                            /** 写入财务记录 */
                            $fst_fin_flag = addFin($push_user_id, $admin_id, $orderInfo['id'], 1, 1, '+' . (int)$orderInfo['price'] * $push_money, '消费佣金');

                            if($fst_fin_flag === false){
                                throw new Exception("会员佣金记录添加失败【" . $push_user_id . "】");
                            }
                        }
                    }
                }

                /** 增加门店营收 */
                Db::name('admin')->where(['id' => $admin_id])->inc('money', (int)$orderInfo['price'])->update();

                /** 门店营收写入财务记录 */
                $shop_fin_flag = addFin(0, $admin_id, $orderInfo['id'], 1, 1, '+' . $orderInfo['price'], '门店营收');

                if($shop_fin_flag === false){
                    throw new Exception("门店营收记录添加失败【" . $orderInfo['id'] . "】");
                }

                /** 增加用户在当前店铺的总消费 */
                $money_total_flag = Db::name('user_shop')->where(['user_id' => $orderInfo['user_id'], 'admin_id' => $admin_id])->inc('money_total', (int)$orderInfo['price'])->update();

                if($money_total_flag === false){
                    throw new Exception("更新会员店铺总消费【" . $orderInfo['user_id'] . "】");
                }

                if($orderInfo['price'] * $admin_info['point_radio'] > 0){
                    /** 增加用户在当前店铺的积分 */
                    $point_flag = Db::name('user_shop')->where(['user_id' => $orderInfo['user_id'], 'admin_id' => $admin_id])->inc('point', (int)$orderInfo['price'] * $admin_info['point_radio'])->update();

                    if($point_flag === false){
                        throw new Exception("更新会员在店铺的积分【" . $orderInfo['user_id'] . "】");
                    }

                    /** 写入财务记录 */
                    addFin($orderInfo['user_id'], $admin_id, $orderInfo['id'], 1, 2, '+' . (int)$orderInfo['price'] * $admin_info['point_radio'], '购买商品');
                }

                /** 更新用户在当前店铺的星级 */
                $userShopModel = new UserShop();
                $star_update = $userShopModel->setStar($orderInfo['user_id'], $admin_id);

                Log::write($star_update);

                /** 订单状态更改 */
                $order_change = Db::name('order')->where(['id' => $orderInfo['id']])->update(['status' => 2, 'pay_time' => time(), 'end_time' => time()]);

                if(!$order_change){
                    throw new Exception("更新订单状态失败：" . $order_change);
                }

                /** 更新商品售卖数量 */
                Db::name('goods')->where(['id' => $orderInfo['goods_id']])->inc('sell_number', $orderInfo['number'])->update();

                /** 添加次卡 */
                if($goods_info['type'] == 3){
                    $add_info = [
                        'order_id'        => $orderInfo['id'],
                        'user_id'         => $orderInfo['user_id'],
                        'admin_id'        => $orderInfo['admin_id'],
                        'goods_id'        => $orderInfo['goods_id'],
                        'card_number_all' => $goods_info['number'],
                        'card_number'     => $goods_info['number'],
                        'status'          => 1,
                        'create_time'     => time(),
                    ];

                    Db::name('user_card')->insert($add_info);
                }

                Db::commit();    
            }catch(Exception $e){
                Db::rollback();
                Log::write($e->getMessage());
                return 'FAIL';
            }

            Log::write('消息提醒开始');
            /** 实例化消息提醒 */
            $newsController = new NewsController($this->app);

            /** 公众号消息提醒 */
            $news = $newsController->news_consume($orderInfo['user_id'], $orderInfo['admin_id'], $orderInfo['goods_id'], 2, $orderInfo['price']);
            Log::write($news);
        }

        Log::write('支付完成');
        return 'SUCCESS';
    }

    // 团购支付回调
    public function notify_group()
    {
        $data = file_get_contents('php://input');
        $data = json_decode($data, true);

        $respData = isset($data['respData']) ? $data['respData'] : [];

        if(empty($respData)){
            return 'FAIL';
        }

        if($data['retCode'] == '000000'){
            $out_trade_no = $respData['orderId'];  // 商户订单号

            $orderInfo  = Db::name('order_group')->where(['order_no' => $out_trade_no])->find();
            $userInfo   = Db::name('users')->where(['id' => $orderInfo['user_id']])->find();
            $group_info = Db::name('goods_group')->where(['id' => $orderInfo['group_id']])->find();
            $goods_info = Db::name('goods')->where(['id' => $group_info['goods_id']])->find();

            /** 店铺ID */
            $admin_id = $orderInfo['admin_id'];

            /** 查询店铺信息 */
            $admin_info = Db::name('admin')->where(['id' => $admin_id])->find();

            Db::startTrans(); 
            try {
                /** 获得直购奖的ID */
                $push_user_id = $orderInfo['to_user_id']?$orderInfo['to_user_id']:$userInfo['pid'];

                if($push_user_id > 0){
                    /** 受益人在当前店铺的资产信息 */
                    $userPushShopInfo = Db::name('user_shop')->where(['user_id' => $push_user_id, 'admin_id' => $admin_id])->find();

                    if($userPushShopInfo && $userPushShopInfo['star_id'] > 0){
                        /** 查询受益人的直购奖比例 */
                        $push_money = Db::name('star')->where(['id' => $userPushShopInfo['star_id']])->value('bonus_ratio');
                        
                        if($push_money > 0){
                            /** 增加受益人在当前店铺的佣金 */
                            $fst_money_flag = Db::name('user_shop')->where(['user_id' => $push_user_id, 'admin_id' => $admin_id])->inc('money', (int)$orderInfo['price'] * $push_money)->update();
                            
                            if($fst_money_flag === false){
                                throw new Exception("更新会员佣金失败【" . $push_user_id . "】");
                            }
                            
                            /** 写入财务记录 */
                            $fst_fin_flag = addFin($push_user_id, $admin_id, $orderInfo['id'], 5, 1, '+' . (int)$orderInfo['price'] * $push_money, '消费佣金');

                            if($fst_fin_flag === false){
                                throw new Exception("会员佣金记录添加失败【" . $push_user_id . "】");
                            }
                        }
                    }
                }

                /** 增加门店营收 */
                Db::name('admin')->where(['id' => $admin_id])->inc('money', (int)$orderInfo['price'])->update();

                /** 门店营收写入财务记录 */
                $shop_fin_flag = addFin(0, $admin_id, $orderInfo['id'], 5, 1, '+' . $orderInfo['price'], '门店营收');

                if($shop_fin_flag === false){
                    throw new Exception("门店营收记录添加失败【" . $orderInfo['id'] . "】");
                }

                /** 增加用户在当前店铺的总消费 */
                $money_total_flag = Db::name('user_shop')->where(['user_id' => $orderInfo['user_id'], 'admin_id' => $admin_id])->inc('money_total', (int)$orderInfo['price'])->update();

                if($money_total_flag === false){
                    throw new Exception("更新会员店铺总消费【" . $orderInfo['user_id'] . "】");
                }

                /** 增加用户在当前店铺的积分 */
                $point_flag = Db::name('user_shop')->where(['user_id' => $orderInfo['user_id'], 'admin_id' => $admin_id])->inc('point', (int)$orderInfo['price'] * $admin_info['point_radio'])->update();

                if($point_flag === false){
                    throw new Exception("更新会员在店铺的积分【" . $orderInfo['user_id'] . "】");
                }

                /** 写入财务记录 */
                addFin($orderInfo['user_id'], $admin_id, $orderInfo['id'], 5, 2, '+' . (int)$orderInfo['price'] * $admin_info['point_radio'], '购买商品');

                /** 更新用户在当前店铺的星级 */
                $userShopModel = new UserShop();
                $userShopModel->setStar($orderInfo['user_id'], $admin_id);

                /** 订单状态更改 */
                $order_change = Db::name('order_group')->where(['id' => $orderInfo['id']])->update(['status' => 2, 'tradeNo' => $respData['tradeNo'], 'pay_time' => time()]);

                if($order_change === false){
                    throw new Exception("更新订单状态失败：单号【" . $orderInfo['order_no'] . "】");
                }

                /** 重新获取订单信息 */
                $order_info_new = Db::name('order_group')->where(['id' => $orderInfo['id']])->find();

                if($order_info_new['chief_id'] != 0){
                    /** 查询团长订单信息 */
                    $chief_order = Db::name('order_group')->where(['id' => $order_info_new['chief_id']])->find();

                    /** 参团人订单ID */
                    $chief_ids = Db::name('order_group')->where(['chief_id' => $order_info_new['chief_id']])->column('id');

                    /** 拼团人数 - 团长 - 参团人数 == 0 表示拼团完成，修改参团订单状态 */
                    if($chief_order['chief_number'] - 1 - count($chief_ids) == 0){
                        $chief_ids[] = $chief_order['id'];

                        /** 拼团批量修改状态为已完成 */
                        Db::name('order_group')->where([['id', 'in', $chief_ids]])->update(['status' => 3, 'end_time' => time()]);

                        /** 更新商品售卖数量 */
                        Db::name('goods')->where(['id' => $group_info['goods_id']])->inc('sell_number', $chief_order['chief_number'])->update();

                        if($goods_info['type'] == 3){
                            $chief_order_list = Db::name('order_group')->where([['id', 'in', $chief_ids]])->select();

                            $card_add_arr = [];
                            foreach($chief_order_list as $v){
                                $add_info = [
                                    'order_id'        => $v['id'],
                                    'user_id'         => $v['user_id'],
                                    'admin_id'        => $admin_id,
                                    'goods_id'        => $goods_info['id'],
                                    'card_number_all' => $goods_info['number'],
                                    'card_number'     => $goods_info['number'],
                                    'order_type'      => 2,
                                    'status'          => 1,
                                    'create_time'     => time(),
                                ];

                                $card_add_arr[] = $add_info;
                            }

                            Db::name('user_card')->insertAll($card_add_arr);
                        }
                    }
                }else if($order_info_new['chief_number'] == 1){
                    Db::name('order_group')->where(['id' => $orderInfo['id']])->update(['status' => 3, 'end_time' => time()]);

                    /** 更新商品售卖数量 */
                    Db::name('goods')->where(['id' => $goods_info['id']])->inc('sell_number', $orderInfo['number'])->update();

                    /** 添加次卡 */
                    if($goods_info['type'] == 3){
                        $add_info = [
                            'order_id'        => $orderInfo['id'],
                            'user_id'         => $orderInfo['user_id'],
                            'admin_id'        => $orderInfo['admin_id'],
                            'goods_id'        => $goods_info['id'],
                            'card_number_all' => $goods_info['number'],
                            'card_number'     => $goods_info['number'],
                            'order_type'      => 2,
                            'status'          => 1,
                            'create_time'     => time(),
                        ];

                        Db::name('user_card')->insert($add_info);
                    }
                }

                Db::commit();    
            }catch(Exception $e){
                Db::rollback();
                Log::write($e->getMessage());
                return 'FAIL';
            }

            /** 实例化消息提醒 */
            $newsController = new NewsController($this->app);

            /** 公众号消息提醒 */
            $newsController->news_money($orderInfo['user_id'], $orderInfo['admin_id'], $goods_info['id'], 2, $orderInfo['price']);
        }

        return 'SUCCESS';
    }

    // 充值支付回调
    public function notify_money()
    {
        $data = file_get_contents('php://input');
        $data = json_decode($data, true);

        $respData = isset($data['respData']) ? $data['respData'] : [];

        if(empty($respData)){
            return 'FAIL';
        }

        if($data['retCode'] == '000000'){
            $out_trade_no = $respData['orderId'];  // 商户订单号

            /** 查询订单信息 */
            $orderInfo  = Db::name('order_money')->where(['order_no' => $out_trade_no])->find();

            /** 店铺ID */
            $admin_id = $orderInfo['admin_id'];

            /** 查询店铺信息 */
            $admin_info = Db::name('admin')->where(['id' => $admin_id])->find();

            Db::startTrans(); 
            try {
                /** 增加门店营收 */
                Db::name('admin')->where(['id' => $admin_id])->inc('money', (int)$orderInfo['number'])->update();

                /** 门店营收写入财务记录 */
                $shop_fin_flag = addFin(0, $admin_id, $orderInfo['id'], 8, 3, '+' . $orderInfo['number'], '门店营收');

                if($shop_fin_flag === false){
                    throw new Exception("门店营收记录添加失败【" . $orderInfo['id'] . "】");
                }

                /** 增加在当前店铺的余额 */
                $user_flag = Db::name('user_shop')->where(['user_id' => $orderInfo['user_id']])->inc('card_money', $orderInfo['number'])->update();
                        
                if($user_flag === false){
                    throw new Exception("更新会员充值余额失败【" . $orderInfo['user_id'] . "】");
                }

                /** 写入财务记录 */
                addFin($orderInfo['user_id'], $admin_id, $orderInfo['id'], 8, 3, '+' . $orderInfo['number'], '充值');

                /** 增加用户在当前店铺的积分 */
                $point_flag = Db::name('user_shop')->where(['user_id' => $orderInfo['user_id'], 'admin_id' => $admin_id])->inc('point', (int)$orderInfo['number'] * $admin_info['point_radio'])->update();

                if($point_flag === false){
                    throw new Exception("更新会员在店铺的积分【" . $orderInfo['user_id'] . "】");
                }

                /** 写入财务记录 */
                addFin($orderInfo['user_id'], $admin_id, $orderInfo['id'], 8, 2, '+' . $orderInfo['number'] * $admin_info['point_radio'], '充值');

                /** 订单状态更改 */
                $order_change = Db::name('order_money')->where(['id' => $orderInfo['id']])->update(['status' => 2, 'pay_time' => time(), 'end_time' => time()]);

                if($order_change === false){
                    throw new Exception("更新订单状态失败：单号【" . $orderInfo['order_no'] . "】");
                }

                Db::commit();    
            }catch(Exception $e){
                Db::rollback();
                Log::write($e->getMessage());
                return 'FAIL';
            }

            /** 实例化消息提醒 */
            $newsController = new NewsController($this->app);

            /** 公众号消息提醒 */
            $newsController->news_recharge($orderInfo['user_id'], $orderInfo['admin_id'], $orderInfo['price']);
        }

        return 'SUCCESS';
    }

    private function getSigns($arr,$key)
    {
        ksort($arr);
        foreach ($arr as $k => $v) {
            if (empty($v)) {
                unset($arr[$k]);
            }
        }

        ksort($arr);

        $stringA = $this->arrToStr($arr);
        return strtoupper(md5($stringA . "&key=".$key));
    }

    private function arrToStr($arr)
    {
        ksort($arr);
        $str = '';
        foreach ($arr as $k => $v) {
            $str .= $k . "=" . $v . "&";
        }

        return rtrim($str,"&");
    }

    //数组转换成xml
    private function arrayToXml($arr)
    {
        $xml = "<root>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . $this->arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }

        $xml .= "</root>";
        return $xml;
    }

    private function checkSign($data,$key)
    {
        $sign_return = $data['sign'];
        unset($data['sign']);
        $sign = $this->getSigns($data,$key);

        if ($sign_return != $sign) {
            return false;
        }

        return true;
    }

    /** 获取当前服务器的IP */
    private function get_client_ip()
    {
        if ($_SERVER['REMOTE_ADDR']) {
            $cip = $_SERVER['REMOTE_ADDR'];
        } elseif (getenv("REMOTE_ADDR")) {
            $cip = getenv("REMOTE_ADDR");
        } elseif (getenv("HTTP_CLIENT_IP")) {
            $cip = getenv("HTTP_CLIENT_IP");
        } else {
            $cip = "unknown";
        }
        return $cip;
    }

    //作用：生成签名
    private function getSign($Obj)
    {
        foreach ($Obj as $k => $v) {
            $reqData[$k] = $v;
        }
        //签名步骤一：按字典序排序参数
        ksort($reqData);
        $String = $this->formatBizQueryParaMap($reqData, false);

        //签名步骤二：在string后加入secretKey
        $String = $String . "|" . $this->secret_key;

        //签名步骤三：MD5加密
        $String = md5($String);

        //签名步骤四：所有字符转为大写
        $result_ = strtoupper($String);
        return $result_;
    }

    ///作用：格式化参数，签名过程需要使用
    private function formatBizQueryParaMap($paraMap, $urlencode)
    {
        $buff = "";
        ksort($paraMap);

        foreach($paraMap as $k => $v){
            if($urlencode){
                $v = urlencode($v);
            }
            $buff .= $k . "=" . $v . "|";
        }

        $reqPar = '';

        if(strlen($buff) > 0){
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }

        return $reqPar;
    }
}